﻿using System;
using System.Text;

class VirtualCodeGenerator
{
    private static Random _random = new Random();

    public static string GenerateVirtualCode()
    {
        string part1 = _random.Next(1000, 10000).ToString();

        // 生成第二部分 - 7
        string part2 = "5301150";

        // 生成第三部分 - 4位随机数
        string part3 = _random.Next(1000, 10000).ToString();

        // 生成第四部分 - 随机大写英文+数字组合
        string part4 = GenerateRandomAlphaNumeric(3);

        // 生成第五部分 - 5位随机数
        string part5 = _random.Next(10000, 100000).ToString();

        // 生成第六部分 - 4位随机数
        string part6 = _random.Next(1000, 10000).ToString();

        // 拼接所有部分，生成唯一的虚拟码
        return $"{part1}-{part2}-{part3}-{part4}-{part5}-{part6}";
    }

    private static string GenerateRandomAlphaNumeric(int length)
    {
        const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        StringBuilder result = new StringBuilder(length);
        for (int i = 0; i < length; i++)
        {
            result.Append(chars[_random.Next(chars.Length)]);
        }
        return result.ToString();
    }

    /// <summary>
    /// 根据时间戳获取24位视觉码
    /// </summary>
    /// <returns></returns>
    public static string GenerateRandomCode()
    {
        // 获取当前 Unix 时间戳（精确到秒）
        long timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

        // 判断时间戳索引大小
        int indexLength = timestamp.ToString().Length;

        // 初始化时间戳
        string timestampPart = "";

        // 根据长度不同进行不同处理
        if (indexLength > 12)
        {
            // 获取当前时间戳的最后 12 位
            timestampPart = timestamp.ToString().Substring(timestamp.ToString().Length - 12);
        }
        else if (indexLength == 12)
        {
            // 使用当前时间戳
            timestampPart = timestamp.ToString();
        }
        else
        {
            // 补全缺失位
            int count = 12 - indexLength;

            timestampPart = timestamp.ToString() + _random.Next(int.Parse("1" + new string('0', count - 1)), int.Parse(new string('9', count)));
        }



        // 生成一个 12 位随机数，分为 2 个 6 位数来生成
        string randomPart = _random.Next(100000, 999999).ToString() +
                            _random.Next(100000, 999999).ToString();

        // 拼接时间戳部分和随机部分，确保是 24 位
        string randomCode = timestampPart + randomPart;

        // 截取前 24 位，确保返回的随机码是 24 位
        return randomCode.Substring(0, 24);
    }
}
